10
תגובות
היי,
עדיף לשמור למשתמש שהתחבר עוגיה או סשן?
אני רואה במדריכים שמשתמשים בסשן אבל לדעתי יותר הגיוני להשתמש בעוגיה.

10 תשובות

avatar ענה משתמש_238505 ב 13 ליוני 2012 #

שסן יותר מאובטח
עוגיה אפשר לשנות...

avatar ענה משתמש_238112 ב 13 ליוני 2012 #

אבל רק סשן לא מספיק. אז מה בדיוק לעשות כשמשתמש מתחבר?
עוגיה עם ID וסשן עם סיסמה מוצפנת? שניהם בסשן? משהו אחר?

אם לדוגמה המשתמש סגר את הדפדפן ונכנס לאתר שוב אז הסשן נמחק ואז ריך להתחבר שוב, ואני לא רוצה שזה יקרה, אז חייבים להשתמש מתישהו בעוגיה רגילה.
תודה.

avatar ענה משתמש_238505 ב 13 ליוני 2012 #

תיראה פה את התגובה שלי
הצעתי פה פיתרון
לחץ כאן

avatar ענה משתמש_238112 ב 13 ליוני 2012 #

אני חושב שמה שintval הציע כבר יותר פשוט מההצעה שלך כי זה בעצם אותו דבר רק בלי עוד טבלה במסד ושליפות.

אבל עדיין השאלה שלי נשארת: איפה נכנס הסשן לתמונה? הרי בקישור שהבאת מדברים רק על עוגיה רגילה...

avatar ענה ilikeme ב 13 ליוני 2012 #

אז ככה: סיישן = אם המשתמש לא רוצה לשמור סיסמה או להיות מחובר אחרי שהוא סוגר את הדפדפן
עוגיות = אם או כן רוצה להישאר מחובר אז מומלץ להשתמש בשניהם
עכשיו עוד דבר חשוב, אם אתה משתמש בעוגיות אז תחשוב שניתן לשנות אותה, לדוגמה יש עוגיה בשם username והערך שלה הוא ilikeme ולפי הערך של העוגיה אתה בודק את המשתמש או לפי הid של המשתמש זה לא משנה, ואז בא איזה אקר ומשנה את העוגיה שלו לדוגמה שזה ilikeme2 ל-Ilikeme ואז יוצא שהוא מחובר לilikeme ולא ilikeme2 וככה הוא פרץ למשתמש אחר.
אז מה עושים? אתה עושה שני עוגיות אחד username שהוא השם משתמש ואחד password
שזה הסיסמה ותדאג שזה יהיה מוצפן.
תבדוק אם הסיסמה והשם משתמש זהים בכל דף ודף במערכת ואם הם לא זהים זה אומר שהמשתמש לא מחובר.

avatar ענה משתמש_238112 ב 13 ליוני 2012 #

את כל מה שאמרת אני יודע בתיאוריה ממזמן וגם מימשתי בעצמי.
אז לפי מה שאתה אומר אני לא צריך להשתמש בסיישן בכלל? זה מה שאני רוצה לדעת בסך הכל.

avatar ענה intval ב 13 ליוני 2012 #

סשן מבוסס על גבי קוקיז. בלעדיהם* לא יהיה לך סשן.
הבעיה עם סשן שדברים בה נשמרים עד סגירת הדפדפן.
זה אומר שאם אתה רוצה לשמור את האידי של המשתמש המחובר גם בפעם הבאה שהוא יגלוש לאתר אתה תצטרך לשמור אותו בקוקי.

את תוכן הקוקי אפשר לשנות. זה אומר שאתה צריך לשמור בקוקי משהו יחסית מוצפן ובהתחברות הבאה לפענח את זה ולבדוק מול המסד על מנת לאמת את הנתונים. אם תסתמך רק על הקוקיז - תצטרך לעשות את כל התהליך הזה בכל פעם שהמשתמש מרענן את העמוד. בנוסף תצטרך לעשות את זה עבור כל משתנה שתרצה לשמור, אחרת המשתמש יוכל לשנות אותו.

מצד שני תוכן הסשן הוא מאובטח - כי רק לך בתור השרת יש גישה לקרוא ולכתוב לשם. מספיק לך לזהות פעם אחת לפי הקוקי את המשתמש, להכניס לסשן את האידי שלו ומכאן והלאה להישתמש רק באידי שרשום בסשן - כיוון שאתה כבר יודע שהוא נכון, אין צורך לפענח אותו או לאמת משהו מול המסד.

בנוסף, קוקי נשלחים עם כל בקשה לשרת. אם אתה שומר סתם דברים מיותרים בקוקיז - זה אומר שכל בקשה התעבור תהיה יותר גדולה (ויותר איטית בהתאמה) בגלל שנשלכים נתונים מיותרים לשם ובחזרה.

* לפדנטים שבינינו - אפשר גם בלי, אבל נשאיר את זה מחוץ לתחום השאלה.

avatar ענה משתמש_238112 ב 13 ליוני 2012 #

תודה על התשובה המפורטת, אלכס.
הבנתי שכדאי לאבטח גם את הסיישן עצמו? ראיתי שמדברים על הפונקציה session_regenerate_id אבל לא הבנתי מPHP.NET איך עובדים עם זה ולמה זה טוב?

avatar ענה intval ב 13 ליוני 2012 #

לדעתי זה כבר מיותר ומיועד למקרים שבהם מישהו מגלה את ה session_id שלך, שם לעצמו בדפדפן על האידי הזה ואז בא לאתר שלך להתחזות בתור אותו בן אדם. session_regenerate_id עושה את מה שהשם אומר - נותן לסשן אידי חדש. ככה שאם גנבו לך לפני שניה את מזהה הסשן הוא כבר לא יהיה אקטואלי כי ממילא תקבל מזהה חדש עכשיו.

יש לזה יותר בעיות מאשר יתרונות, כמו למשל העובדה שדפדפן עושה כמה בקשות במקביל לשרת, אם אחד הסקריפטים יחליט לשנות את האידי, הבקשה השניה עשויה להיכשל.

אם אתה רוצה להגן על הסשן מפני חתיפה - תוכל לרשום לתוך הסשן את הדפדפן ואת האיפי של הגולש ובכל בקשה לבדוק שמי שהגיע אליך הוא בעל אותו איפי ודפדפן.
אבל חשוב לציין שגם לזה יש חסרונות. מעבר לחישוב ובדיקה מיותרת יש את העבודה שאנשים שגולשים דרך פרוקסי יהיו המון בעיות של כניסה למערכת או לאשנים שגולשים מהעבודה שבה יש לחברה שלהם vpn (כל החברה מחוברת לאינטרנט דרך יציאה אחת) - יהיו את אותם הפרמטרים, ככה שהיכולת של זה לעזור גם לא רבה.

הדרך הטובה ביותר להגן על הסשן זה לעשות ככה שלא יגנבו אותו.

avatar ענה משתמש_238112 ב 13 ליוני 2012 #

תודה רבה!